include Makehead

LdFlags += -Ttext 0 -e start_32
CFlags += -Iinclude

DIR = boot init kernel kernel/blk_drv kernel/chr_drv kernel/math mm  fs fs/minix lib

ARCHIVES = kernel/kernel.o  mm/mm.o fs/fs.o 
FILESYSTEMS = fs/minix/minix.o 
DRIVERS = kernel/blk_drv/blk_drv.a kernel/chr_drv/chr_drv.a 
MATH = kernel/math/math.a 
LIBS = lib/lib.a 

default: Image

# 1_44 fda size = 2880 * 512, 明确设置 count 解决 objcopy 生成文件过大问题
# hexdump kernel.bin 可算出 400 × 512 足矣。
Image: kernel.bin 
	dd if=boot/bootsect of=Image bs=512 count=1 
	dd if=boot/setup of=Image bs=512 seek=1 count=4
	dd if=kernel.bin of=Image bs=512 seek=5 count=8187
	sync

# 生成的 kernel.in 太大，bochs 不可用， 而 qemu-system-i386 可正常使用
# 主要是 objcopy 填充段间空洞导致
kernel.bin: build system
	cp -f  system kernel.tmp 
	$(STRIP) kernel.tmp
	$(OBJCOPY)  kernel.tmp $@ 
	rm -f kernel.tmp 

system: boot/head.o  init/main.o $(ARCHIVES) $(FILESYSTEMS) $(DRIVERS) $(MATH) $(LIBS) 
	$(LD) $(LdFlags) -o $@ $^
	
build:
	for i in $(DIR); do (cd $$i; make); done 

clean:
	rm -f kernel.bin system Image 
	rm -rf .vscode
	for i in $(DIR); do (cd $$i; make clean); done 

# c.img 为根文件系统，可到 oldlinux 网站下载
# grubdos.img 在 deepin 中访问 `sudo mount -t msdos grubdos.img -o loop /mnt`, 虚拟机中使用 mtools 工具
# `make grubdos` 后方可使用 grubdos.img 引导, 否则直接使用 Image。
run:
	qemu-system-i386 -fda Image -boot a  -hda "../128m.img"

# 由 grubdos.img 引导，可修改引导菜单 menu.lst
grubdos:
	mcopy -i grubdos.img -o Image ::/boot/Image 
	mcopy -i grubdos.img -o menu.lst ::/boot/grub
